package com.sherlocky.config.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.sherlocky.config.dao.ConfigDAO;
import com.sherlocky.config.dto.ConfigDTO;


@Service
@Transactional
public class ConfigService{
	
	public static final String VALUE_SEPARATOR= "||";
	
	@Autowired
	private ConfigDAO configDAO;
	
	/**
	 * 系统配置
	 * @param key
	 * @return
	 */
	public String getValue(String key) {
		return configDAO.getValue(key);
	}
	
	public int getIntValue(String key) {
		return NumberUtils.toInt(configDAO.getValue(key), 0);
	}
	
	public boolean getBooleanValue(String key) {
		String v = configDAO.getValue(key);
		if (StringUtils.isBlank(v)) {
			return false;
		}
		return Boolean.parseBoolean( v );
	}
	
	public void updateConfig(ConfigDTO dto) {
		
		Assert.notNull(dto.getVar(), "key is null!");
//		if (isConfigExist(dto.getVar())) {
//			configDAO.update(dto);
//		} else {
//			configDAO.create(dto);
//		}
		configDAO.save(dto);
	}
	
	public void updateConfig (String key, String value) {
		
		Assert.notNull(key, "key is null!");
//		ConfigDTO dto = new ConfigDTO();
//		dto.setVar(key);
//		dto.setValue(value);
//		
//		updateConfig(dto);
		configDAO.save(key, value);
	}
	
	public void updateConfigs(ConfigDTO[] dtos) {
		
		for (ConfigDTO configDTO : dtos) {
			updateConfig(configDTO);
		}
	}
	
	public boolean isConfigExist(String key) {
		
		Assert.notNull(key, "key is null!");
		ConfigDTO queryDTO = new ConfigDTO();
		queryDTO.setVar(key);
		
		return configDAO.queryCount(queryDTO) != 0 ;
		
	}
	
	public void appendConfig(String key, String[] values) {
		
		if (values == null || values.length == 0) {
			return;
		}
		Assert.notNull(key, "key is null!");
		
		String origValue = getValue(key);
		if (StringUtils.isEmpty(origValue)) {
			origValue = StringUtils.join(values, VALUE_SEPARATOR);
		} else {
			List<String> origList = Arrays.asList(StringUtils.split(origValue, VALUE_SEPARATOR));
			for (String value : values) {
				if (!origList.contains(value)) {
					origValue += VALUE_SEPARATOR + value;
				}
			}
		}
		updateConfig(key, origValue);
	}
	
	public void sliceConfig(String key, String[] values) {
		
		if (values == null || values.length == 0) {
			return;
		}
		Assert.notNull(key, "key is null");
		
		String origValue = getValue(key);
		
		String[] origArray = StringUtils.split(origValue, VALUE_SEPARATOR);
		for (String value : values) {
			origArray = (String[])ArrayUtils.removeElement(origArray, value);
		}
		
		updateConfig(key, StringUtils.join(origArray, VALUE_SEPARATOR));
	}
	
	public List<ConfigDTO> getConfigs(String[] keys) {
		
		List<ConfigDTO> list = new ArrayList<ConfigDTO>();
		if (keys != null && keys.length > 0) {
			
			for (String key : keys) {
				ConfigDTO configDTO = (ConfigDTO)configDAO.findById(key);
				if (configDTO != null) {
					list.add(configDTO);
				}
			}
		}
		
		return list;
	}
}
